gridview: Simplify allocation code
authorBenjamin Otte <otte@redhat.com>
Tue, 22 Oct 2019 02:59:34 +0000 (04:59 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 30 May 2020 23:26:46 +0000 (19:26 -0400)
It doesn't fix the bug I'm after, but it looks a lot better.

gtk/gtkgridview.c

index 1800f12df52c5674cfcb17ba001f4d7ad3c4543a..c5c6418f733082fff9a821d9d8c32c9cde8bd376 100644 (file)
@@ -1028,44 +1028,58 @@ gtk_grid_view_size_allocate (GtkWidget *widget,
   x = - gtk_grid_view_update_adjustment (self, opposite_orientation);
   y = - gtk_grid_view_update_adjustment (self, self->orientation);
 
+  /* step 5: run the size_allocate loop */
+  x = -x;
+  y = -y;
   i = 0;
   row_height = 0;
+
   for (cell = gtk_list_item_manager_get_first (self->item_manager);
        cell != NULL;
        cell = gtk_rb_tree_node_get_next (cell))
     {
       if (cell->parent.widget)
         {
-          if (i == 0)
-            {
-              y += row_height;
-              row_height = cell->size;
-            }
+          row_height += cell->size;
+
           gtk_grid_view_size_allocate_child (self,
                                              cell->parent.widget,
                                              x + ceil (self->column_width * i),
                                              y,
                                              ceil (self->column_width * (i + 1)) - ceil (self->column_width * i),
                                              row_height);
-          i = (i + 1) % self->n_columns;
+          i++;
+          if (i >= self->n_columns)
+            {
+              y += row_height;
+              i -= self->n_columns;
+              row_height = 0;
+            }
         }
       else
         {
           i += cell->parent.n_items;
-          if (i > self->n_columns)
+          /* skip remaining row if we didn't start one */
+          if (i > cell->parent.n_items && i >= self->n_columns)
             {
               i -= self->n_columns;
               y += row_height;
-              row_height = cell->size;
+              row_height = 0;
+            }
 
-              if (i > self->n_columns)
-                {
-                  guint unknown_rows = (i - 1) / self->n_columns;
-                  int unknown_height = unknown_rows * self->unknown_row_height;
-                  row_height -= unknown_height;
-                  y += unknown_height;
-                  i %= self->n_columns;
-                }
+          row_height += cell->size;
+
+          /* skip rows that are completely contained by this cell */
+          if (i >= self->n_columns)
+            {
+              guint unknown_rows, unknown_height;
+
+              unknown_rows = i / self->n_columns;
+              unknown_height = unknown_rows * self->unknown_row_height;
+              row_height -= unknown_height;
+              y += unknown_height;
+              i %= self->n_columns;
+              g_assert (row_height >= 0);
             }
         }
     }